package com.jinmdz.app.api.wrapper;

import com.jinmdz.app.api.base.BaseService;
import com.jinmdz.app.api.constant.FileConst;
import com.jinmdz.app.api.model.config.ConfigApp;
import com.jinmdz.fmis.common.util.DataUtil;
import com.jinmdz.fmis.common.util.DateUtil;
import com.jinmdz.fmis.common.util.FileUtil;
import com.jinmdz.fmis.common.util.third.QrCodeUtil;
import com.jinmdz.fmis.core.constant.Constants;
import com.jinmdz.fmis.mapper.entity.DocumentFileEntity;
import net.coobird.thumbnailator.Thumbnails;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.util.Date;

/**
 * DocumentFile封装处理类
 *
 * @author LiCongLu
 * @date 2020-01-06 17:27
 */
@Component
public class DocumentWrapper extends BaseService {

    @Resource
    private ConfigApp configApp;

    /**
     * 保存图片文件
     *
     * @param
     * @return
     * @author LiCongLu
     * @date 2020-01-06 17:40
     */
    public DocumentFileEntity saveImageFile(MultipartFile file) {
        if (file != null && !file.isEmpty()) {
            String suffix = FileUtil.getSuffix(file.getOriginalFilename());
            return saveImageFile(suffix, imageFile -> file.transferTo(imageFile));
        }
        return null;
    }

    /**
     * 保存图片文件
     *
     * @param
     * @return
     * @author LiCongLu
     * @date 2020-03-04 17:40
     */
    public DocumentFileEntity saveBaseImage(String file) {
        if (file != null && !file.isEmpty()) {
            String suffix = ".jpg";
            return saveBaseImageFile(suffix, file);
        }
        return null;
    }

    /**
     * 生成二维码文件
     *
     * @param text 二维码文本
     * @return
     * @author LiCongLu
     * @date 2020-01-07 16:14
     */
    public DocumentFileEntity saveQRCodeImage(String text) {
        String format = "png";
        String suffix = "." + format;
        return saveImageFile(suffix, imageFile -> QrCodeUtil.writeToPath(text, format, imageFile.toPath()));
    }

    /**
     * 通用生成图片文件
     *
     * @param suffix   后缀名
     * @param listener 图片生成监听
     * @return
     * @author LiCongLu
     * @date 2020-01-07 16:04
     */
    private DocumentFileEntity saveImageFile(String suffix, OnImageFileListener listener) {
        try {
            if (suffix != null && listener != null) {
                DocumentFileEntity entity = new DocumentFileEntity();
                entity.setFileName(String.valueOf(System.currentTimeMillis()) + suffix);
                entity.setFileExtension(suffix);

                /**
                 * 保存图片
                 */
                Date nowDate = nowDate();
                String newPath = DateUtil.formatPattern(nowDate, DateUtil.PATTERN_10_PATH);
                File imagePath = new File(getDirPath(FileConst.DirPath.IMAGE, newPath));
                File imageFile = new File(imagePath, entity.getFileName());

                listener.onImageFile(imageFile);

                // 未能生成图片文件，则返回空
                if (!imageFile.exists()) {
                    return null;
                }

                entity.setFilePath(getUrlPath(imageFile));
                entity.setFileLength(imageFile.length());

                File thumbPath = new File(getDirPath(FileConst.DirPath.THUMB, newPath));
                File thumbFile = new File(thumbPath, entity.getFileName());

                /**
                 * 缓存图片
                 */
                Thumbnails.of(imageFile)
                        .size(FileConst.THUMB_SIZE, FileConst.THUMB_SIZE)
                        .toFile(thumbFile);

                entity.setThumbPath(getUrlPath(thumbFile));
                return entity;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通用生成图片文件
     *
     * @param suffix       后缀名 如 .jpg
     * @param baseImageStr base64字符串
     * @return
     * @author Gaoxiangliang
     * @date 2020-03-04 10:32
     */
    public DocumentFileEntity saveBaseImageFile(String suffix, String baseImageStr) {
        try {
            if (suffix != null) {
                DocumentFileEntity entity = new DocumentFileEntity();
                entity.setFileName(String.valueOf(System.currentTimeMillis()) + suffix);
                entity.setFileExtension(suffix);

                /**
                 * 保存图片
                 */
                Date nowDate = nowDate();
                String newPath = DateUtil.formatPattern(nowDate, DateUtil.PATTERN_10_PATH);
                String filename = entity.getFileName();
                String imageFilePath = getDirPath(FileConst.DirPath.IMAGE, newPath);
                FileUtil.write2ImageFile(baseImageStr, imageFilePath + "\\" + filename);
                File imagePath = new File(imageFilePath);
                //生成文件
                File imageFile = new File(imagePath, entity.getFileName());
                // 未能生成图片文件，则返回空
                if (!imageFile.exists()) {
                    return null;
                }

                entity.setFilePath(getUrlPath(imageFile));
                entity.setFileLength(imageFile.length());

                File thumbPath = new File(getDirPath(FileConst.DirPath.THUMB, newPath));
                File thumbFile = new File(thumbPath, entity.getFileName());

                /**
                 * 缓存图片
                 */
                Thumbnails.of(imageFile)
                        .size(FileConst.THUMB_SIZE, FileConst.THUMB_SIZE)
                        .toFile(thumbFile);

                entity.setThumbPath(getUrlPath(thumbFile));
                return entity;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private interface OnImageFileListener {
        /**
         * 保存图片文件
         *
         * @param imageFile 图片文件
         * @return
         * @throws Exception
         * @author LiCongLu
         * @date 2020-01-07 16:02
         */
        void onImageFile(File imageFile) throws Exception;
    }

    /**
     * 删除图片文件
     *
     * @param entity 图片文档实体
     * @return
     * @author LiCongLu
     * @date 2020-01-06 17:34
     */
    public void deleteImageFile(DocumentFileEntity entity) {
        if (entity != null) {
            deleteUrlPath(entity.getFilePath());
            deleteUrlPath(entity.getThumbPath());
        }
    }

    /**
     * 生成文件对象
     *
     * @param urPath 文件路径
     * @return
     * @author LiCongLu
     * @date 2020-01-06 17:34
     */
    private File getDirFile(String urPath) {
        urPath = urPath.replace("/", "\\");
        return new File(configApp.getFileDirPath(), urPath);
    }

    /**
     * 得到保存了路径，自动生成yyyy/MM/dd目录
     *
     * @param
     * @return
     * @author LiCongLu
     * @date 2020-01-06 17:40
     */
    public String getDirPath(String dirPath, String newPath) {
        File dirFile = new File(configApp.getFileDirPath() + configApp.getFileUrlPath() + "/" + dirPath, newPath);
        if (!dirFile.exists()) {
            dirFile.mkdirs();
        }
        return dirFile.getAbsolutePath();
    }

    /**
     * 拼接路径
     *
     * @param
     * @return
     * @author LiCongLu
     * @date 2020-01-06 17:40
     */
    private String getUrlPath(File file) {
        return file.getAbsolutePath().substring(configApp.getFileDirPath().length()).replace("\\", "/");
    }


    /**
     * @Author liconglu
     * @Description 删除无效路径
     * @Date 2019/1/18  13:14
     * @Param
     * @Return
     */
    private void deleteUrlPath(String urlPath) {
        try {
            if (DataUtil.valid(urlPath)) {
                File file = getDirFile(urlPath);
                if (file != null && file.exists()) {
                    file.delete();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 判断Url地址的文件路径是否存在
     *
     * @param filePath 文件路径
     * @return
     * @author LiCongLu
     * @date 2020-01-07 11:28
     */
    public boolean isExists(String filePath) {
        File file = new File(configApp.getFileDirPath(), filePath);
        return file.exists();
    }

    /**
     * 获取静态资源路径
     *
     * @param dir 文件路径
     * @return
     * @author LiCongLu
     * @date 2020-01-06 17:32
     */
    private String getResPath(String dir) {
        try {
            File classFile = new File(ResourceUtils.getURL(ResourceUtils.CLASSPATH_URL_PREFIX).getPath());
            // 包含汉字会出现乱码，需进行转码
            String classPath = new String(java.net.URLDecoder.decode(classFile.getAbsolutePath(), Constants.UTF8));
            File dirFile = new File(classPath, dir);
            if (dirFile.exists()) {
                return dirFile.getAbsolutePath();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

}
